package tag29_20_08.serial_2;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class Ser07_manuellSerialisieren {

	static class Motor { //Darf nicht Serializable sein
		String typ;
		int leistung;
		
		public Motor(String typ, int leistung) {
			this.typ = typ;
			this.leistung = leistung;
		}
		
		public String toString() { return typ + " " + leistung; }
	}
	
	static class Auto implements Serializable {
		transient Motor motor;
		int baujahr;
		String hersteller;
		
		public String toString() {
			return hersteller + " " + baujahr + ". Motor: " + motor; 
		}
		
		private void writeObject(ObjectOutputStream oos) throws IOException {
			System.out.println("Auto / writeObject");
//			oos.writeInt(baujahr);
			oos.defaultWriteObject(); //Standardserialisieren wieder einschalten
			oos.writeUTF(motor.typ);
			oos.writeInt(motor.leistung);
		}
		
		private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
			System.out.println("Auto / readObject");
//			this.baujahr = ois.readInt();
			ois.defaultReadObject();//Standarddeserialisieren wieder einschalten
			String motorTyp = ois.readUTF();
			int motorLeistung = ois.readInt();
			
			motor = new Motor(motorTyp, motorLeistung);
		}
	}
	
	
	public static void main(String[] args) throws Exception {
		
		Auto a1 = new Auto();
		a1.baujahr = 2000;
		a1.hersteller = "VW";
		a1.motor = new Motor("X3", 3000);

		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a4"));
		//!!! Die writeObject der Klasse Auto ersetzt die Standardserialisierung.
		oos.writeObject(a1); //Serialisieren: a1.writeObject(oos);
		oos.close();

		System.out.println("Serialisiert: " + a1);

		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a4"));
		Object obj2 = ois.readObject(); //Deserialisieren
		ois.close();

		System.out.println("Deserialisieret: " + obj2);
		
	}

}
